package com.sys.app.entity.util;

import com.alibaba.druid.util.StringUtils;

import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class DateTimeUtil {

    /**
     * 获取去当前时间
     * @return
     */
    public static String getNowTime(){
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return LocalDateTime.now().format(fmt);
    }

    /**
     * 获取去当前时间
     * @param format 格式时间格式:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String getNowTime(String format){
        if(StringUtils.isEmpty(format)){
            format="yyyy-MM-dd HH:mm:ss";
        }
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.now().format(fmt);
    }
    /**
     * 从当前时间获取上个月的第一天
     * @param startDate:String(yyyy-MM-dd)
     * @return:String(yyyy-MM-dd)
     * @throws Exception
     */
    public static String getLastMonthFirstDay(String startDate) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate date = LocalDate.parse(startDate, fmt);
        LocalDate lastMonth = date.minusMonths(1); // 当前月份减1
        LocalDate firstDay = lastMonth.with(TemporalAdjusters.firstDayOfMonth()); // 获取当前月的第一天
        return  firstDay.format(fmt);
    }

    /**
     * 从当前时间获取当月的第一天
     * @param startDate:String(yyyy-MM-dd)
     * @return:String(yyyy-MM-dd)
     * @throws Exception
     */
    public static String getMonthFirstDay(String startDate) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate date = LocalDate.parse(startDate, fmt);
        LocalDate firstDay = date.with(TemporalAdjusters.firstDayOfMonth()); // 获取当前月的第一天
        return  firstDay.format(fmt);

    }

    /**
     * 从当前时间获取上个月的最后一天
     * @param startDate:String(yyyy-MM-dd)
     * @return:String(yyyy-MM-dd)
     * @throws Exception
     */
    public static String getLastMonthEndDay(String startDate)  {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate date = LocalDate.parse(startDate, fmt);
        LocalDate lastMonth = date.minusMonths(1); // 当前月份减1
        LocalDate lastDay = lastMonth.with(TemporalAdjusters.lastDayOfMonth()); // 获取当前月的最后一天
        return  lastDay.format(fmt);
    }

    /**
     * 从当前时间获取当前月的最后一天
     * @param startDate:String(yyyy-MM-dd)
     * @return:String(yyyy-MM-dd)
     * @throws Exception
     */
    public static String getMonthEndDay(String startDate)  {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate date = LocalDate.parse(startDate, fmt);
        LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth()); // 获取当前月的最后一天
        return  lastDay.format(fmt);
    }


    /**
     * 计算两个时间内所有日期天数包含边界 <p>
     * 例如：2023-01-01至2023-01-31 <p>返回包含2023-01-01和2023-01-31
     * @param startDate 开始时间-格式（yyyy-MM-dd）
     * @param endDate 结束时间-格式（yyyy-MM-dd）
     * @return List<String> days 格式（yyyy-MM-dd）
     * @throws ParseException
     */
    public static List<String> getDays(String startDate, String endDate)  {
        List<String> lDate = new ArrayList();//集合
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate startTime = LocalDate.parse(startDate,fmt);
        LocalDate endTime = LocalDate.parse(endDate,fmt);

        long daysBetween = ChronoUnit.DAYS.between(startTime, endTime);
        for(long i=0L;i<=daysBetween;i++){
            lDate.add(startTime.plusDays(i).format(fmt));
        }
        return lDate;
    }

    /**
     * 字符串日期转LocalDate
     * @param date：日期-格式(yyyy-MM-dd)
     * @param format：格式类型
     * @return
     */
    public static LocalDate StringToLocalDate(String date,String format){
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern(format);
        return LocalDate.parse(date, fmt);
    }

    /**
     * LocalDate日期转字符串
     * @param date：日期
     * @param format：格式类型
     * @return yyyy-MM-dd
     */
    public static String LocalDateToString(LocalDate date,String format){
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern(format);
        return date.format(fmt);
    }

    /**
     * LocalDate转Date
     * @param date：日期
     * @return yyyy-MM-dd
     */
    public static Date LocalDateToDate(LocalDate date){
        return Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * Date转LocalDate
     * @param date：日期
     * @return yyyy-MM-dd
     */
    public static LocalDate DateToLocalDate(Date date){
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

}
